const cron = require('node-cron');
const sys_user = require('../models/sys_user')
const el_exam = require('../models/el_exam');
const e = require('express');

class Scheduler {
    constructor() {
        this.tasks = new Map()
    }

    // 初始化定时任务
    init() {
        // 每15分钟检查一次用户活跃状态
        this.schedule('*/15 * * * *', 'updateUserLastActiveTime', this.updateUserLastActiveTime.bind(this))

        // 每1小时检查一次考试状态
        this.schedule('0 0 5 * * * *', 'checkExamStatus', this.checkExamStatus.bind(this))
    }

    // 注册定时任务
    schedule(cronExpression, taskName, taskFunction) {
        const task = cron.schedule(cronExpression, taskFunction, {
            scheduled: false,
            timezone: "Asia/Shanghai"
        })

        this.tasks.set(taskName, task)
        task.start()
        console.log(`定时任务 "${taskName}" 已启动，Cron表达式: ${cronExpression}`)
    }

    //更新在线用户
    //每十分钟检查一次用户活跃状态
    async updateUserLastActiveTime() {
        // 实现更新用户活跃状态的逻辑，判断当前时间与 last_active_time的差值，如果超过一定阈值（比如 90 秒没有心跳），就认为用户已经离线或掉线。
        const threshold = 600000 // 10 分钟
        const now = new Date()
        const users = await sys_user.findPaging()
        for (const user of users) {
            const lastActiveTime = new Date(user.last_active_time);
            if (now - lastActiveTime > threshold) {
                await sys_user.updateUserState(user.id, 0) // 0 离线
            }
        }
        console.log('用户活跃状态更新完成')
    }

    //检查考试状态，并更新
    //根据考试结束时间，检查考试是否结束，3 已结束
    async checkExamStatus() {
        const now = new Date()
        const exams = await el_exam.findExamAll(1,100000)
        for (const exam of exams) {
            const endTime = new Date(exam.end_time)
            if ( exam.time_limit==1 && now > endTime) {
                await el_exam.updateExamStatus(exam.id, 3) // 3 已结束
                console.log(`考试 ${exam.title} 已结束`)
            }
        }
        console.log('考试状态检查完成')
    }






}


module.exports = Scheduler;